#!/usr/bin/env bash

ENV=PRO

IMAGES=./images

DEPLOY=./deploy

MODULES=(
  "[SERVER]=ccool-gateway [PORT]=8080"
  "[SERVER]=ccool-netdisk [PORT]=8081"
  "[SERVER]=ccool-uaa [PORT]=8083"
)

MODULE_COUNT=${#MODULES[*]}

COMMON_MODULE=ccool-common

# 编译
function compile() {
  eval module=($1)
  mvn clean package install -pl ${module[SERVER]} -am
}

# 根据 Dockerfile 模板，生成相应模块的 Dockerfile
function create_dockerfile() {
  template=$1
  dockerfile=$2/Dockerfile
  eval module=($3)
  sed \
  -ne "s/#{PORT}/${module[PORT]}/" \
  -ne "s/#{SERVER}/${module[SERVER]}/" \
  -nre "/^#\s*?${template}\s+?start/,/^#\s*?${template}\s+?end/w ${dockerfile}" \
  Dockerfile
}

# 读取 bootstrap.yaml 的 server.port
function port() {
  module=$1
  bootstrap=$module/src/main/resources/bootstrap.yaml
  awk '$1 == "port:" { print $2 }' $bootstrap
}

# 编译安装公共模块
mvn clean package install -pl ${COMMON_MODULE} -am

for ((i=0; i < ${MODULE_COUNT}; i++))
do
  # 使用 eval 命令模拟 map
  m=${MODULES[$i]}
  declare -A module
  eval module=($m)

  # 创建模块镜像目录
  image_dir=${IMAGES}/${module[SERVER]}
  mkdir -p $image_dir

  # 编译模块
  compile $m
  mv ${module[SERVER]}/target/*.jar $image_dir

  # 如果没有指定 Dockerfile 模板，就用默认模板
  template=${module[SERVER]}
  if [ -z "$(awk "/${template}/ {print $1}" Dockerfile)" ]; then
    template=default
  fi

  # 生成Dockerfile
  create_dockerfile $template $image_dir  "$m"
done

# 配置部署脚本
row=$(awk '$0~/^# MODULES/ { print NR}' deploy.sh)
for ((i=0; i < ${MODULE_COUNT}; i++))
do
  m=${MODULES[$i]}
  sed -i "$((row+i))a MODULES[${i}]=\"${m}\"" ./deploy.sh
done

row=$(awk '$0~/^# PROFILE/ { print NR }' deploy.sh)
sed -i "${row}a PROFILE=${ENV}" ./deploy.sh

cat ./deploy.sh

mkdir deploy

cp ./deploy.sh ./deploy/deploy.sh
